/**
 * Project Name:ExcelUtil
 * File Name:ExcelUtil.java
 * Package Name:com.bwda.dsrs.common.util.poi
 * Date:2019年4月28日
 * Copyright (c) 2019, 江苏保旺达软件有限公司 All Rights Reserved.
 */
package com.bwda.dsrs.systemservice.util.util.poi;


import com.bwda.dsrs.base.util.Convert;
import com.bwda.dsrs.systemservice.domain.annotation.Excel;
import com.bwda.dsrs.systemservice.util.util.ReflectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.*;

/**
 * Excel相关处理
 *
 * @author youzhen
 */
public class ExcelUtil<T> {
//    private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
//
//    /**
//     * Excel sheet最大行数，默认65536
//     */
//    public static final int SHEET_SIZE = 65536;
//
//    /**
//     * 工作表名称
//     */
//    private String sheetName;
//
//    /**
//     * 导出类型（EXPORT:导出数据；IMPORT：导入模板）
//     */
//    private Excel.Type type;
//
//    /**
//     * 工作薄对象
//     */
//    private Workbook wb;
//
//    /**
//     * 工作表对象
//     */
//    private Sheet sheet;
//
//    /**
//     * 导入导出数据列表
//     */
//    private List<T> list;
//
//    /**
//     * 注解列表
//     */
//    private List<Field> fields;
//
//    /**
//     * 实体对象
//     */
//    public Class<T> clazz;
//
//    public ExcelUtil(Class<T> clazz) {
//        this.clazz = clazz;
//    }
//
//    public void init(List<T> list, String sheetName, Type type) {
//        if (list == null) {
//            list = new ArrayList<T>();
//        }
//        this.list = list;
//        this.sheetName = sheetName;
//        this.type = type;
//        createExcelField();
//        createWorkbook();
//    }
//
//    /**
//     * 对excel表单默认第一个索引名转换成list
//     *
//     * @param is 输入流
//     * @return 转换后集合
//     */
//    public List<T> importExcel(InputStream is) throws Exception {
//        return importExcel(StringUtils.EMPTY, is);
//    }
//
//    /**
//     * 对excel表单指定表格索引名转换成list
//     *
//     * @param sheetName 表格索引名
//     * @param is        输入流
//     * @return 转换后集合
//     */
//    public List<T> importExcel(String sheetName, InputStream is) throws Exception {
//        this.type = Type.IMPORT;
//        this.wb = WorkbookFactory.create(is);
//        List<T> list = new ArrayList<T>();
//        Sheet sheet = null;
//        if (StringUtils.isNotEmpty(sheetName)) {
//            // 如果指定sheet名,则取指定sheet中的内容.
//            sheet = wb.getSheet(sheetName);
//        } else {
//            // 如果传入的sheet名不存在则默认指向第1个sheet.
//            sheet = wb.getSheetAt(0);
//        }
//        if (sheet == null) {
//            throw new IOException("文件sheet不存在");
//        }
//        int rows = sheet.getPhysicalNumberOfRows();
//        if (rows > 0) {
//            // 默认序号
//            int serialNum = 0;
//            // 有数据时才处理 得到类的所有field.
//            Field[] allFields = clazz.getDeclaredFields();
//            // 定义一个map用于存放列的序号和field.
//            Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>(16);
//            for (int col = 0; col < allFields.length; col++) {
//                Field field = allFields[col];
//                Excel attr = field.getAnnotation(Excel.class);
//                boolean flagattr = attr != null;
//                boolean flagattrtype = attr.type() == Type.ALL || attr.type() == type;
//                if (flagattr && flagattrtype) {
//                    // 设置类的私有字段属性可访问.
//                    field.setAccessible(true);
//                    fieldsMap.put(++serialNum, field);
//                }
//            }
//            for (int i = 1; i < rows; i++) {
//                // 从第2行开始取数据,默认第一行是表头.
//                Row row = sheet.getRow(i);
//                int cellNum = serialNum;
//                T entity = null;
//                for (int column = 0; column < cellNum; column++) {
//                    Object val = this.getCellValue(row, column);
//                    // 如果不存在实例则新建.
//                    entity = (entity == null ? clazz.newInstance() : entity);
//                    // 从map中得到对应列的field.
//                    Field field = fieldsMap.get(column + 1);
//                    // 取得类型,并根据对象类型设置值.
//                    Class<?> fieldType = field.getType();
//                    if (String.class == fieldType) {
//                        String s = Convert.toStr(val);
//                        if (StringUtils.endsWith(s, ".0")) {
//                            val = StringUtils.substringBefore(s, ".0");
//                        } else {
//                            val = Convert.toStr(val);
//                        }
//                    } else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) {
//                        val = Convert.toInt(val);
//                    } else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) {
//                        val = Convert.toLong(val);
//                    } else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) {
//                        val = Convert.toDouble(val);
//                    } else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) {
//                        val = Convert.toFloat(val);
//                    } else if (BigDecimal.class == fieldType) {
//                        val = Convert.toBigDecimal(val);
//                    } else if (Date.class == fieldType) {
//                        if (val instanceof String) {
//                            val = DateTimeUtils.parseDate(val);
//                        } else if (val instanceof Double) {
//                            val = DateUtil.getJavaDate((Double) val);
//                        }
//                    }
//                    if (StringUtils.isNotNull(fieldType)) {
//                        Excel attr = field.getAnnotation(Excel.class);
//                        String propertyName = field.getName();
//                        if (StringUtils.isNotEmpty(attr.targetAttr())) {
//                            propertyName = field.getName() + "." + attr.targetAttr();
//                        } else if (StringUtils.isNotEmpty(attr.readConverterExp())) {
//                            val = reverseByExp(String.valueOf(val), attr.readConverterExp());
//                        }
//                        ReflectUtils.invokeSetter(entity, propertyName, val);
//                    }
//                }
//                list.add(entity);
//            }
//        }
//        return list;
//    }
//
//
//    /**
//     * 反向解析值 男=0,女=1,未知=2
//     *
//     * @param propertyValue 参数值
//     * @param converterExp  翻译注解
//     * @return 解析后值
//     * @throws Exception
//     */
//    public static String reverseByExp(String propertyValue, String converterExp) throws Exception {
//        try {
//            String[] convertSource = converterExp.split(",");
//            for (String item : convertSource) {
//                String[] itemArray = item.split("=");
//                if (itemArray[1].equals(propertyValue)) {
//                    return itemArray[0];
//                }
//            }
//        } catch (Exception e) {
//            throw e;
//        }
//        return propertyValue;
//    }
//
//    /**
//     * 得到所有定义字段
//     */
//    private void createExcelField() {
//        this.fields = new ArrayList<Field>();
//        List<Field> tempFields = new ArrayList<>();
//        Class<?> tempClass = clazz;
//        tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));
//        while (tempClass != null) {
//            tempClass = tempClass.getSuperclass();
//            if (tempClass != null) {
//                tempFields.addAll(Arrays.asList(tempClass.getDeclaredFields()));
//            }
//        }
//        putToFields(tempFields);
//    }
//
//    /**
//     * 放到字段集合中
//     */
//    private void putToFields(List<Field> fields) {
//        for (Field field : fields) {
//            Excel attr = field.getAnnotation(Excel.class);
//            if (attr != null) {
//                if (attr.type() == Type.ALL || attr.type() == type) {
//                    this.fields.add(field);
//                }
//            }
//        }
//    }
//
//    /**
//     * 创建一个工作簿
//     */
//    public void createWorkbook() {
//        this.wb = new SXSSFWorkbook(500);
//    }
//
//    /**
//     * 获取单元格值
//     *
//     * @param row    获取的行
//     * @param column 获取单元格列号
//     * @return 单元格值
//     */
//    public Object getCellValue(Row row, int column) {
//        if (row == null) {
//            return row;
//        }
//        Object val = "";
//        try {
//            Cell cell = row.getCell(column);
//            if (cell != null) {
//                if (cell.getCellTypeEnum() == CellType.NUMERIC) {
//                    val = cell.getNumericCellValue();
//                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
//                        // POI Excel 日期格式转换
//                        val = DateUtil.getJavaDate((Double) val);
//                    } else {
//                        if ((Double) val % 1 > 0) {
//                            val = new DecimalFormat("0.00").format(val);
//                        } else {
//                            val = new DecimalFormat("0").format(val);
//                        }
//                    }
//                } else if (cell.getCellTypeEnum() == CellType.STRING) {
//                    val = cell.getStringCellValue();
//                } else if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
//                    val = cell.getBooleanCellValue();
//                } else if (cell.getCellTypeEnum() == CellType.ERROR) {
//                    val = cell.getErrorCellValue();
//                }
//
//            }
//        } catch (Exception e) {
//            return val;
//        }
//        return val;
//    }
}